package algorithm.middle;

import java.util.Arrays;
import java.util.Calendar;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 给你一个正整数 n ，请你找出符合条件的最小整数，其由重新排列 n 中存在的每位数字组成，并且其值大于 n 。如果不存在这样的正整数，则返回 -1 。
 * <p>
 * 注意 ，返回的整数应当是一个 32 位整数 ，如果存在满足题意的答案，但不是 32 位整数 ，同样返回 -1 。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：n = 12
 * 输出：21
 * 示例 2：
 * <p>
 * 输入：n = 21
 * 输出：-1
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/next-greater-element-iii
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

//单调栈
public class NextGreaterElement556 {

    public int nextGreaterElement(int n) {
        //转换为chars
        char[] chars = String.valueOf(n).toCharArray();
        //从后往前，找到第一组相邻的升序元素对
        for (int i = chars.length - 1; i > 0; i--) {
            if (chars[i - 1] < chars[i]) {
                //将i开始到最后的元素进行排序
                Arrays.sort(chars, i, chars.length);
                //排序后，从排序的元素中顺序找到第一个比i-1大的元素，进行交换
                for (int j = i; j < chars.length; j++) {
                    if (chars[j] > chars[i - 1]) {
                        //交换
                        char temp = chars[i - 1];
                        chars[i - 1] = chars[j];
                        chars[j] = temp;
                        long ans = Long.parseLong(String.valueOf(chars));
                        if (ans > Integer.MAX_VALUE) return -1;
                        return (int) ans;
                    }
                }

            }
        }
        //没找到 返回-1
        return -1;
    }

}
